package com.yzd.learnjava.io;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Random;

import com.yzd.learnjava.util.Print;

public class Worm implements Serializable{
	private static Random random = new Random(47);
	private Data[] d = {
			new Data(random.nextInt(10)),
			new Data(random.nextInt(10)),
			new Data(random.nextInt(10)),
	};
	private Worm next;
	private char c ;
	public Worm(int i , char x) {
		Print.print("Worm Constructor:" + i);
		c = x ;
		if(--i > 0) {
			next = new Worm(i, (char)(x + 1));
		}
	}
	
	public Worm() {
		Print.print("Default constructor");
	}
	
	public String toString() {
		StringBuilder sb = new StringBuilder(":");
		sb.append(c);
		sb.append("(");
		for(Data ds : d) {
			sb.append(ds);
		}
		sb.append(")");
		if(next != null) {
			sb.append(next);
		}
		return sb.toString();
	}
	
	public static void main(String[] args) throws Exception {
		Worm w = new Worm(6, 'a');
		Print.print("w = " + w);
		ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("worm.out"));
		out.writeObject("Worm storage\n");
		out.writeObject(w);
		out.close();
		
		ObjectInputStream in = new ObjectInputStream(new FileInputStream("worm.out"));
		String s = (String)in.readObject();
		Worm w2 = (Worm)in.readObject();
		Print.print(s + " w2 " + w2);
		
		ByteArrayOutputStream bout = new ByteArrayOutputStream();
		ObjectOutputStream out2 = new ObjectOutputStream(bout);
		out2.writeObject("Worm storage\n");
		out2.writeObject(w);
		out2.flush();
		
		ObjectInputStream in2 = new ObjectInputStream(new ByteArrayInputStream(bout.toByteArray()));
		s = (String)in2.readObject();
		Worm w3 = (Worm)in2.readObject();
		Print.print(s + " w3 " + w3);
		
	}
}

class Data implements Serializable{
	private int n ;
	public Data(int n) {
		this.n = n;
	}
	public String toString(){
		return Integer.toString(n);
	}
}
